home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / snmp_processes.nasl < prev    next >
Text File  |  2005-01-14  |  6KB  |  249 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7.  
  8. if(description)
  9. {
  10.  script_id(10550);
  11.  script_version ("$Revision: 1.11 $");
  12.  
  13.  name["english"] = "Obtain processes list via SNMP";
  14.  name["francais"] = "Enumeration des processus par SNMP";
  15.  
  16.  script_name(english:name["english"],
  17.           francais:name["francais"]);
  18.  
  19.  desc["english"] = "
  20. This script uses SNMP to obtain the list of
  21. the processes that are running on the remote host.
  22.  
  23. Risk factor : Low";
  24.  
  25.  desc["francais"] = "
  26. Ce script utilise SNMP pour obtenir la liste des
  27. processus qui tournent sur la machine distante";
  28.  
  29.  script_description(english:desc["english"],
  30.              francais:desc["francais"]);
  31.  
  32.  summary["english"] = "Enumerates processes via SNMP";
  33.  summary["francais"] = "Enumeration des processus par SNMP";
  34.  script_summary(english:summary["english"],
  35.          francais:summary["francais"]);
  36.  
  37.  script_category(ACT_GATHER_INFO);
  38.  
  39.  script_copyright(english:"This script is Copyright (C) 2000 Renaud Deraison");
  40.  family["english"] = "SNMP";
  41.  script_family(english:family["english"]);
  42.  
  43.  script_dependencies("snmp_default_communities.nasl");
  44.  script_require_keys("SNMP/community");
  45.  exit(0);
  46. }
  47.  
  48.  
  49. #
  50. # Solaris comes with a badly configured snmpd which
  51. # always reply with the same value. We make sure the answers
  52. # we receive are not in the list of default values usually
  53. # answered...
  54. #
  55. function valid_snmp_value(value)
  56. {
  57.  if("/var/snmp/snmpdx.st" >< value)return(0);
  58.  if("/etc/snmp/conf" >< value)return(0);
  59.  if( (strlen(value) == 1) && (ord(value[0]) < 32) )return(0);
  60.  return(1);
  61. }
  62.  
  63. #--------------------------------------------------------------------#
  64. # Forges an SNMP GET NEXT packet                                     #
  65. #--------------------------------------------------------------------#
  66. function get_next(community, id, object)
  67. {
  68.  len = strlen(community);
  69. #display("len : ", len, "\n");
  70.  len = len % 256;
  71.  
  72.  tot_len = 4 + strlen(community) + 12 + strlen(object) + 4;
  73. # display(hex(tot_len), "\n");
  74.  _r = raw_string(0x30, tot_len, 0x02, 0x01, 0x00, 0x04, len);
  75.  o_len = strlen(object) + 2;
  76.  
  77.  a_len = 13 + strlen(object);
  78.  _r = _r + community + raw_string( 0xA1,
  79.     a_len, 0x02, 0x01, id,   0x02, 0x01, 0x00, 0x02,
  80.     0x01, 0x00, 0x30,o_len) + object + raw_string(0x05, 0x00);
  81. # display("len : ", strlen(_r), "\n");
  82.  return(_r);
  83. }
  84.  
  85. #---------------------------------------------------------------------#
  86. # Extracts the object from a reply                                    #
  87. #---------------------------------------------------------------------#
  88. function extract_obj(data)
  89. {
  90.  datalen = strlen(data);
  91.  if (datalen < 7) return FALSE;
  92.  
  93.  if(ord(data[2]) == 2)
  94.   {
  95.   cmty_len = ord(data[6]);
  96.   off = 18 + cmty_len;
  97.  }
  98.  else
  99.  {
  100.   cmty_len  = ord(data[7]);
  101.  
  102.   off = 20 + cmty_len;
  103.  }
  104.  
  105.  if (off > datalen) return FALSE; 
  106.  
  107.  len_payload = ord(data[off]);
  108.  _obj = "";
  109.  
  110.  if (off+5 > datalen) return FALSE; 
  111.  
  112.  total_len = ord(data[off+5])+6;
  113.  
  114.  if (off+total_len > datalen) return FALSE; 
  115.  
  116.  for(i=4;i<total_len;i=i+1)
  117.  {
  118.   _obj = _obj + raw_string(ord(data[off+i]));
  119.  }
  120.  
  121.  _len = strlen(_obj) + 2;
  122. # display(">len : ", _len, "\n");
  123.  _len = _len % 255;
  124.  _obj2 = raw_string(0x30, _len);
  125.  _obj = _obj2 + _obj;
  126.  
  127.  l = strlen(_obj);
  128. # for(i=0;i<l;i=i+1)display(hex(ord(_obj[i])), " ");
  129. # display("\n");
  130.  return(_obj);
  131. }
  132.  
  133.  
  134. #---------------------------------------------------------------------#
  135. # Extracts the data from a reply                                      #
  136. #---------------------------------------------------------------------#
  137. function extract_data(data)
  138. {
  139.  datalen = strlen(data);
  140.  
  141.  if (datalen < 7) return FALSE;
  142.  
  143.  if(ord(data[2]) == 2)
  144.  {
  145.   cmty_len = ord(data[6]);
  146.   off1 = 18 + cmty_len;
  147.   off = 39 + cmty_len;
  148.  }
  149.  else
  150.  {
  151.   cmty_len  = ord(data[7]);
  152.   off1 = 20 + cmty_len;
  153.   off = 41 + cmty_len;
  154.  }
  155.  
  156.  if (off1+5 > datalen) return FALSE;
  157.  
  158.  off = 18 + ord(data[off1+5])+ 7 + cmty_len;
  159. # display("OFF = ", off, "\n");
  160.  
  161.  if (off > datalen) return FALSE;
  162.  _len = ord(data[off]);
  163.  _data = ""; 
  164.  
  165.  
  166.  #display("OFF :" , off, " _LEN : ", hex(_len), "\n");
  167.  #_len =  ord(data[off+18+_len]);
  168.  
  169.  if (off+_len+1 > datalen) return FALSE;
  170.  for(i=0;i<_len;i=i+1){
  171.      _data = _data + raw_string(ord(data[off+i+1]));
  172.     }
  173.  #display("data : ", _data, "\n");
  174.  return(_data);
  175. }
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183. community = get_kb_item("SNMP/community");
  184. if(!community)exit(0);
  185.  
  186. port = get_kb_item("SNMP/port");
  187. if(!port) port = 161;
  188.  
  189. prcss = "";
  190.  
  191. soc = open_sock_udp(port);
  192.  
  193. first = raw_string(0x30, 0x11, 0x06, 0x0D, 
  194.            0x2B, 0x06, 0x01, 0x04, 0x01, 0x0b, 0x02, 0x03,
  195.            0x01, 0x04, 0x02, 0x01, 0x16);
  196.           
  197. id = 2;
  198. req = get_next(id:id, community:community, object:first);
  199.  
  200. send(socket:soc, data:req);
  201. r = recv(socket:soc, length:1025);
  202. if(strlen(r) < 48)exit(0);
  203.  
  204. nxt = extract_obj(data:r);
  205. data = extract_data(data:r);
  206. #display(data, "\n");
  207. if(strlen(data))
  208. {
  209.  if(valid_snmp_value(value:data))
  210.  prcss = string(prcss, ". ", data, "\n");
  211. }
  212.  
  213.  
  214. for(z=1;z<255;z=z+1)
  215. {
  216. req = get_next(id:id+z, community:community, object:nxt);
  217. send(socket:soc, data:req);
  218. r = recv(socket:soc, length:1025);
  219. #display("PKT LEN : ", strlen(r), "\n");
  220. if(strlen(r) < 48)
  221.  {
  222.   z = 256;
  223.  }
  224. else
  225.  {
  226.  nxt = extract_obj(data:r);
  227.  data = extract_data(data:r);
  228.  if(strlen(data))
  229.   {
  230.   #display(data, "\n");
  231.   if(valid_snmp_value(value:data))
  232.       prcss = string(prcss, ". ", data, "\n");
  233.   }
  234.  }
  235. }
  236.  
  237. if(strlen(prcss))
  238. {
  239.  report = string(
  240. "It was possible to obtain the list of processes of the\n",
  241. "remote host via SNMP : \n\n", prcss, "\n",
  242. "An attacker may use this information to gain more knowledge about\n",
  243. "the target host.\n",
  244. "Solution : disable the SNMP service on the remote host if you do not\n",
  245. "           use it, or filter incoming UDP packets going to this port\n",
  246. "Risk factor : Low");
  247.  security_warning(protocol:"udp", port:port, data:report);
  248. }
  249.